package com.gzx.risk.core.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;

import java.io.*;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 文件下载工具类
 */
public class FileDownloadUtils {

    public static File downloadPDFFile(String url) throws IOException {
        if (url == null || url.trim().isEmpty()) {
            throw new IllegalArgumentException("URL 不能为空");
        }

        String fileName = UUID.randomUUID().toString()+".pdf";
        if (fileName == null || fileName.trim().isEmpty()) {
            throw new IOException("无法从 URL 中提取有效的文件名: " + url);
        }

        File tempDir = new File(System.getProperty("java.io.tmpdir"));
        File downloadedFile = new File(tempDir, fileName);

        if (downloadedFile.exists()) {
            if (!downloadedFile.delete()) {
                throw new IOException("无法在临时目录中创建文件，因为同名文件已存在且无法删除: " + downloadedFile.getPath());
            }
        }

        HttpRequest request = HttpRequest.get(url).setFollowRedirects(true);

        try (HttpResponse response = request.execute();
             InputStream in = response.bodyStream()) {

            if (response.getStatus() != 200) {
                // 如果请求失败，清理已创建的空文件
                if (downloadedFile.exists()) {
                    downloadedFile.delete();
                }
                throw new IOException("文件下载失败，HTTP 状态码: " + response.getStatus() + "，URL: " + url);
            }

            if (in == null) {
                if (downloadedFile.exists()) {
                    downloadedFile.delete();
                }
                throw new IOException("下载的文件内容为空，URL: " + url);
            }

            FileUtil.writeFromStream(in, downloadedFile);

            if (downloadedFile.length() == 0) {
                downloadedFile.delete();
                throw new IOException("下载的文件大小为0，可能是网络中断或文件本身为空，URL: " + url);
            }

        } catch (IOException e) {
            if (downloadedFile.exists()) {
                downloadedFile.delete();
            }
            throw e;
        }

        return downloadedFile;
    }

    /**
     * 根据 URL 下载文件，返回临时 File 对象
     * 增强版：增加了响应状态检查和更详细的异常处理
     *
     * @param url 文件 URL
     * @return 下载后的临时 File 对象
     * @throws IOException 如果下载失败或文件无效
     */
    public static File downloadFile(String url) throws IOException {
        if (url == null || url.trim().isEmpty()) {
            throw new IllegalArgumentException("URL 不能为空");
        }

        File tempFile = FileUtil.createTempFile();

        HttpRequest request = HttpRequest.get(url)
                // 关键改动：设置自动跟随重定向
                .setFollowRedirects(true);


        try (HttpResponse response = request.execute();
             InputStream in = response.bodyStream()) {

            // 关键步骤：检查 HTTP 响应状态码
            if (response.getStatus() != 200) {
                // 如果请求失败，删除创建的空临时文件，并抛出异常
                FileUtil.del(tempFile);
                throw new IOException("文件下载失败，HTTP 状态码: " + response.getStatus() + "，URL: " + url);
            }

            // 检查响应体是否为空
            if (in == null) {
                FileUtil.del(tempFile);
                throw new IOException("下载的文件内容为空，URL: " + url);
            }

            // 将流写入临时文件
            FileUtil.writeFromStream(in, tempFile);

            // 检查文件大小，如果为0，说明下载失败
            if (tempFile.length() == 0) {
                FileUtil.del(tempFile);
                throw new IOException("下载的文件大小为0，可能是网络中断或文件本身为空，URL: " + url);
            }

        } catch (IOException e) {
            // 发生异常时，确保临时文件被删除
            FileUtil.del(tempFile);
            throw e; // 将异常向上抛出，让调用者处理
        }

        return tempFile;
    }

    public static File zipTempFile(File sourceTempFile) throws IOException {
        if (sourceTempFile == null || !sourceTempFile.exists() || !sourceTempFile.canRead()) {
            throw new IllegalArgumentException("源临时文件无效或不可读: " + (sourceTempFile != null ? sourceTempFile.getPath() : "null"));
        }

        String sourceFileName = sourceTempFile.getName();
        String zipFileName = sourceFileName + ".zip";
        File zipTempFile = File.createTempFile(zipFileName, null);

        // 使用 try-with-resources 确保所有流都被正确关闭
        try (FileOutputStream fileOutputStream = new FileOutputStream(zipTempFile);
             ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
             InputStream fileInputStream = new FileInputStream(sourceTempFile)) {

            // 创建一个 ZIP 条目，条目名称使用原始文件的名称
            ZipEntry zipEntry = new ZipEntry(sourceFileName);
            zipOutputStream.putNextEntry(zipEntry);

            // 读取源文件内容并写入到 ZIP 输出流中
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                zipOutputStream.write(buffer, 0, bytesRead);
            }

            // 关闭当前 ZIP 条目
            zipOutputStream.closeEntry();

        } catch (IOException e) {
            // 如果发生异常，删除刚刚创建的 ZIP 临时文件
            if (zipTempFile.exists()) {
                zipTempFile.delete();
            }
            throw e; // 将异常向上抛出，让调用者处理
        }

        // 返回新创建的 ZIP 临时文件
        return zipTempFile;
    }

    /**
     * 根据 URL 下载文件，保存到指定目录
     *
     * @param url      文件 URL
     * @param saveDir  保存目录
     * @param fileName 保存的文件名
     * @return 下载后的 File 对象
     * @throws IOException
     */
    public static File downloadFile(String url, String saveDir, String fileName) throws IOException {
        // 创建保存目录（如果不存在）
        File dir = new File(saveDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        
        // 构建保存文件路径
        File saveFile = new File(dir, fileName);
        
        // 下载文件并写入指定文件
        try (InputStream in = HttpUtil.createGet(url).execute().bodyStream()) {
            FileUtil.writeFromStream(in, saveFile);
        }
        
        return saveFile;
    }

    /**
     * 下载文件到指定路径
     *
     * @param url      文件 URL
     * @param filePath 完整的保存文件路径
     * @return 下载后的 File 对象
     * @throws IOException 下载异常
     */
    public static File downloadFileToPath(String url, String filePath) throws IOException {
        File saveFile = new File(filePath);
        
        // 创建父目录（如果不存在）
        File parentDir = saveFile.getParentFile();
        if (parentDir != null && !parentDir.exists()) {
            parentDir.mkdirs();
        }
        
        // 下载文件并写入指定文件
        try (InputStream in = HttpUtil.createGet(url).execute().bodyStream()) {
            FileUtil.writeFromStream(in, saveFile);
        }
        
        return saveFile;
    }

    public static void main(String[] args) throws IOException {
        File file = downloadPDFFile("https://jieyouzu.oss-cn-beijing.aliyuncs.com/jyzzj-line-prod/contract/2025112609334867892659585/1/2025-11-26/委托担保申请书.pdf");
        File file1 = zipTempFile(file);
        System.out.println(file1.getAbsolutePath());
    }
}